package com.cskaoyan.javase.oop3._3local._3notice;

/**
 * 使用局部内部类的注意事项:
 *      局部内部类的成员方法中,可以访问作用域内部定义在上面的一个局部变量
 *      但是一旦在局部内部类中访问了该局部变量,那么该局部变量就会成为一个常量,是一个局部常量
 *          说白了它隐式的被final修饰了,取值不会再更改了!
 *      Variable 'a' is accessed from within inner class, needs to be final or effectively final
 *
 * why?为什么?
 *      首先为了解决局部变量和对象要访问该局部变量且对象生命周期更长的冲突问题
 *          jvm会把该局部变量作为对象中的成员变量存储
 *          然后为了避免"同步取值"的选择,干脆要求该局部变量不可修改取值,是一个常量
 *
 * 在最后，特别强调一点。后面学习的 匿名内部类 和 Lambda表达式 本质依然是局部内部类，这一条注意事项仍然生效。
 *
 * @since 14:46
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
}

class EnclosedClazz {
    void test() {
        // 定义局部变量
        int a = 10;
        // 定义局部内部类
        class Inner {
            // 局部内部类的成员方法
            public void testInner() {
                System.out.println(a);
                // System.out.println(a++);
                // a = 100;
            }
        }
    }
}